/*
 * @Author: lirl
 * @Date: 2021-06-07 11:13:48
 * @LastEditTime: 2024-09-03 11:12:07
 * @Description: 公共service
 */
import { GroupService, MaintenanceToolboxService } from 'jdf-jssdk';
import { omit } from 'lodash-es';
import { getAllUserNodes } from 'jdf-util';
import { postData, getDatas } from '@/api/data-source/commonRequestApi';
import COMMON_URL from '@/api/interface-urls/commonUrl';
import { bizServiceURL } from '@/api/utils/constants';

class CommonService {
  /**
   * 公共表单的查询事件
   * @param {*} instanceId 流程实例id
   * @returns 表单数据
   */
  getFormCommonInfo = (instanceId) => getDatas(COMMON_URL.GET_INFO, { instanceId });

  /**
   * 公共表单保存事件
   * 用于以下几种情况：
   * 1、正常业务流转中的保存操作，为用户手动点击的保存操作，会调用业务数据的保存接口保存业务数据
   * 2、运维工具箱，由运维人员发起的保存操作，会调用运维工具箱专属的数据保存接口保存运维后的业务数据
   * 3、通过工作台的运维端，由运维人员发起的保存操作，会调用运维端的数据保存接口保存运维后的业务数据
   * 4、从流程融合快速起草页面(data.JDF_FORM_COMPOSITE_FLAG 为true)，
   *    由用户手动点击保存按钮发起的保存操作，不实时调用保存接口，只需要把已经构建好的需要保存的数据，返回给保存操作的发起方
   *   （即流程融合快速起草页面），快速起草页面获取到数据后，调用自己的接口来保存业务数据
   * @param {*} data 保存数据
   * @returns 保存成功的id
   */
  saveFormCommonInfo = async data => {
    if (data.JDF_FORM_COMPOSITE_FLAG) {
      return {
        data: {
          data
        }
      };
    }
    // 判断是否为维护端，如果是维护端，则调用 maintainSaveFormCommonInfo, 不是则直接返回。
    const {
      maintainField,
      maintainToolbox
    } = data;
    if (maintainField || maintainToolbox) {
      const param = this.omitMaintainFieldParam(data);
      const {
        documentInfo
      } = param;
      const fieldParam = JSON.stringify(this.omitMaintainFieldParam(JSON.parse(documentInfo)));
      const saveDatas = {
        ...param,
        documentInfo: fieldParam,
      };
      // 如果来源是运维工具箱，则调用运维工具箱的保存，否则调用运维端的保存
      const res = await (maintainToolbox
        ? new MaintenanceToolboxService(bizServiceURL).save(saveDatas)
        : this.maintainSaveFormCommonInfo(saveDatas));
      return res;
    }
    const res = await postData(COMMON_URL.ADD, data);
    return res;
  }

  /**
   * 维护端表单保存事件
   * @param {*} data 保存数据
   * @returns 保存成功的id
   */
  maintainSaveFormCommonInfo = data => postData(COMMON_URL.MAINTAIN_ADD, data);

  /**
   * 获取稿纸记录
   * @param {*} instanceId 稿纸记录 instanceId
   */
  getDraftRecord = async (instanceId) => {
    const data = await getDatas(COMMON_URL.GET_RECORD, { instanceId });
    return data;
  }

  /**
   * 获取主送抄送数据
   * @param {string} processDefinition 流程模板code
   * @param {string} gatewayData 是否获取网冠数据,默认不获取网关数据
   */
  getSendCommonData = async (processDefinition, gatewayData = false) => {
    const data = await getDatas(COMMON_URL.GET_SEND, { processDefinition, gatewayData });
    return data;
  }

  /**
   * 获取负责人
   * @param {*} identityId 拟稿人身份id
   * @param {*} groupCode 群组编码
   */
  getPrincipal = async (identityId, groupCode = 'itngrfzr') => {
    const data = await new GroupService(bizServiceURL).getSimpleIdentityTree({ groupCode, identityId });
    const [user] = getAllUserNodes(data.children);
    return user?.name;
  }

  /**
   * 格式化主抄送数据
   * @param data 数据
   * @param coordX 坐标X
   * @param coordY 坐标Y
   * @param rowspan 合并行数
   * @param multiple 是否多选
   * data数据中parentId的，parentName，pkId，isLeaf字段必须有，用来做附件背靠背数据格式拼装
   */
  formatSendData = (data, coordX, coordY, rowspan, multiple = true) => {
    const [res] = data;
    const {
      name,
      id,
      object,
      children,
      order,
    } = res;
    return {
      ...object,
      pkId: id,
      order,
      multiple,
      orgs: children.map((t) => ({
        parentId: t.pid,
        parentName: name,
        pkId: t.id,
        id: t.id,
        order: t.order,
        type: t.type,
        ...t.object,
        name: t.object.userName ?? t.object.orgName,
        isLeaf: true,
        aliasPrefix: object.aliasPrefix ?? '',
        parentOrder: order,
      })),
      'coord-x': coordX,
      'coord-y': coordY,
      rowspan
    };
  };

  /**
   * 根据人员编码和流程实例ID写入参会部门数据接口
   * @param {*} userId 用户id，字符串用逗号隔开
   * @param {*} instanceId 流程实例id
   * @returns
   */
  saveCounterDeptData = (userIds, instanceId) => postData(COMMON_URL.SAVE_COUNTER_DEPT_DATA, {}, {
    params: {
      userIds,
      instanceId
    }
  });

  /**
   * 去除维护端不需要的保存参数
   * @param {*} data
   * @returns
   */
  omitMaintainFieldParam = (data) => omit(data, ['definitionId', 'definitionName', 'instanceVersion',
    'userIdentity', 'userId', 'orgPath', 'orgName', 'orgId',
    'dcoumentState', 'documentRelation', 'documentVersion', 'domain', 'endTime',
    'instanceVersion', 'reflectClass', 'startTime', 'endTime', 'taskId', 'nodeName',
    'instanceId', 'taskUserName', 'pmsid', 'nodeId', 'drafterOrgCode', 'templateName',
    'spread1', 'maintainField']);
}

export default CommonService;
